<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>call、apply、bind</title>
</head>
<body>
<h6>call、apply和bind都是函数对象上的方法。</h6>
<p>call‌：用于调用一个函数，并允许你指定函数执行时的上下文（即this的值），同时可以传递任意数量的参数给函数。例如，fn.call(obj, arg1, arg2, ...)会将fn的上下文设置为obj，并传入arg1、arg2等参数执行函数‌12。</p>
<p>apply‌：与call类似，也是用于调用函数并指定上下文，但参数是以数组的形式传递的。例如，fn.apply(obj, [arg1, arg2, ...])会将fn的上下文设置为obj，并传入数组中的参数执行函数‌12。</p>
<p>bind‌：与call和apply不同，它不会立即执行函数，而是返回一个新的函数。这个新函数的上下文被绑定到指定的对象，并且可以传递参数。例如，fn.bind(obj, arg1, arg2)会返回一个新的函数，该函数的上下文为obj，并且可以传入arg1、arg2等参数‌12。</p>
<p>Reflect.apply 是 Reflect 对象的一个静态方法，用于调用一个函数，并允许你指定 this 的值以及传递给函数的参数。这个方法类似于apply</p>
<script>
    function foo(a, b, c) {
        console.log(this.name, a, b, c)
    }
    const obj = {
        name: 'obj'
    }
    foo.call(obj, 1, 2, 3)
    foo.apply(obj, [1, 2, 3])
    foo.bind(obj, 1, 2,3)() // 柯里化函数
    Reflect.apply(foo, obj, [1, 2, 3])
</script>
</body>
</html>
